/**
 * iframe页面通信枢纽，父页面与iframe页面保持一致
 */

/**
 * 消息中心分发范围
 * @member {string} GAME 游戏（此工程就一个）
 */
enum HUB_SCOPE {
	GAME = 'game',
};

/**
 * 消息中心分发数据格式
 * @property { HUB_SCOPE} scope 消息中心分发范围
 * @property {T} type 消息类型
 * @property {D} data 消息数据
 */
interface IMessageData<T, D> {
	scope: HUB_SCOPE,
	type: T,
	data: D
}

/**
 * 消息中心（普通页面与iframe页面通信）
 * @param {Window} userWindow 用户窗口
 * @param {HUB_SCOPE} scope 消息分发范围
 */
class MessageHub<TYPE> {

	private userWnd: Window;
	private scope: HUB_SCOPE;

	constructor(userWindow: Window, scope: HUB_SCOPE) {
		this.userWnd = userWindow;
		this.scope = scope;
	}

	/**
	 * 发送消息
	 * @param type 消息类型
	 * @param data 数据对象
	 */
	public dispatch<D>(type: TYPE, data: D): void {
		const msg: IMessageData<TYPE, D> = {
			scope: this.scope,
			type: type,
			data: data
		};
		this.userWnd.postMessage(msg, this.userWnd.origin);
	}

	/**
	 * 监听消息
	 * @param type 消息类型
	 * @param callback 回调函数
	 */
	public listen<D>(type: TYPE, callback: { (data: IMessageData<TYPE, D>): void }): void {
		this.userWnd.addEventListener('message', (event: MessageEvent) => {
			if (event.origin !== window.origin) {
				console.log('message from illegal origin')
				return;
			}
			const data: IMessageData<TYPE, D> = event.data;
			if (event.data.scope !== this.scope) {
				return;
			}
			if (data.type !== type) {
				return;
			}
			callback(data);
		});
	}

}


export { MessageHub, HUB_SCOPE };
export type { IMessageData };